home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
x11
/
twm_930531.lha
/
twm
/
parse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-30
|
31KB
|
1,079 lines
/*****************************************************************************/
/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
/** Salt Lake City, Utah **/
/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/
/** Cambridge, Massachusetts **/
/** **/
/** All Rights Reserved **/
/** **/
/** Permission to use, copy, modify, and distribute this software and **/
/** its documentation for any purpose and without fee is hereby **/
/** granted, provided that the above copyright notice appear in all **/
/** copies and that both that copyright notice and this permis- **/
/** sion notice appear in supporting documentation, and that the **/
/** names of Evans & Sutherland and M.I.T. not be used in advertising **/
/** in publicity pertaining to distribution of the software without **/
/** specific, written prior permission. **/
/** **/
/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/
/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/
/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
/** OR PERFORMANCE OF THIS SOFTWARE. **/
/*****************************************************************************/
/***********************************************************************
*
* $XConsortium: parse.c,v 1.52 91/07/12 09:59:37 dave Exp $
*
* parse the .twmrc file
*
* 17-Nov-87 Thomas E. LaStrange File created
* 10-Oct-90 David M. Sternlicht Storing saved colors on root
***********************************************************************/
#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Xmu/CharSet.h>
#include "twm.h"
#include "screen.h"
#include "menus.h"
#include "util.h"
#include "gram.h"
#include "parse.h"
#include <X11/Xatom.h>
#ifndef SYSTEM_INIT_FILE
#define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.twmrc"
#endif
#define BUF_LEN 300
static FILE *twmrc;
static int ptr = 0;
static int len = 0;
static char buff[BUF_LEN+1];
static char overflowbuff[20]; /* really only need one */
static int overflowlen;
static char **stringListSource, *currentString;
static int ParseUsePPosition();
extern int yylineno;
extern FILE *yyin, *yyout;
extern int mods;
int ConstrainedMoveTime = 400; /* milliseconds, event times */
static int twmFileInput(), twmStringListInput();
void twmUnput();
int (*twmInputFunc)();
extern char *defTwmrc[]; /* default bindings */
/***********************************************************************
*
* Procedure:
* ParseTwmrc - parse the .twmrc file
*
* Inputs:
* filename - the filename to parse. A NULL indicates $HOME/.twmrc
*
***********************************************************************
*/
static int doparse (ifunc, srctypename, srcname)
int (*ifunc)();
char *srctypename;
char *srcname;
{
mods = 0;
ptr = 0;
len = 0;
yylineno = 1;
ParseError = FALSE;
twmInputFunc = ifunc;
overflowlen = 0;
yyparse();
if (ParseError) {
fprintf (stderr, "%s: errors found in twm %s",
ProgramName, srctypename);
if (srcname) fprintf (stderr, " \"%s\"", srcname);
fprintf (stderr, "\n");
}
return (ParseError ? 0 : 1);
}
int ParseTwmrc (filename)
char *filename;
{
int i;
char *home = NULL;
int homelen = 0;
char *cp = NULL;
char tmpfilename[257];
/*
* If filename given, try it, else try ~/.twmrc.# then ~/.twmrc. Then
* try system.twmrc; finally using built-in defaults.
*/
for (twmrc = NULL, i = 0; !twmrc && i < 4; i++) {
switch (i) {
case 0: /* -f filename */
cp = filename;
break;
case 1: /* ~/.twmrc.screennum */
if (!filename) {
home = getenv ("HOME");
if (home) {
homelen = strlen (home);
cp = tmpfilename;
(void) sprintf (tmpfilename, "%s/.twmrc.%d",
home, Scr->screen);
break;
}
}
continue;
case 2: /* ~/.twmrc */
if (home) {
tmpfilename[homelen + 7] = '\0';
}
break;
case 3: /* system.twmrc */
cp = SYSTEM_INIT_FILE;
break;
}
if (cp) twmrc = fopen (cp, "r");
}
if (twmrc) {
int status;
if (filename && cp != filename) {
fprintf (stderr,
"%s: unable to open twmrc file %s, using %s instead\n",
ProgramName, filename, cp);
}
/* had to put this line in to get my flex output
* to work with file input. (Michael Balzer)
*/
yyin = twmrc;
status = doparse (twmFileInput, "file", cp);
fclose (twmrc);
return status;
} else {
if (filename) {
fprintf (stderr,
"%s: unable to open twmrc file %s, using built-in defaults instead\n",
ProgramName, filename);
}
return ParseStringList (defTwmrc);
}
}
int ParseStringList (sl)
char **sl;
{
stringListSource = sl;
currentString = *sl;
return doparse (twmStringListInput, "string list", (char *)NULL);
}
/***********************************************************************
*
* Procedure:
* twmFileInput - redefinition of the lex input routine for file input
*
* Returned Value:
* the next input character
*
***********************************************************************
*/
static int twmFileInput()
{
if (overflowlen) return (int) overflowbuff[--overflowlen];
while (ptr == len)
{
if (fgets(buff, BUF_LEN, twmrc) == NULL)
return 0;
yylineno++;
ptr = 0;
len = strlen(buff);
}
return ((int)buff[ptr++]);
}
static int twmStringListInput()
{
if (overflowlen) return (int) overflowbuff[--overflowlen];
/*
* return the character currently pointed to
*/
if (currentString) {
unsigned int c = (unsigned int) *currentString++;
if (c) return c; /* if non-nul char */
currentString = *++stringListSource; /* advance to next bol */
return '\n'; /* but say that we hit last eol */
}
return 0; /* eof */
}
/***********************************************************************
*
* Procedure:
* twmUnput - redefinition of the lex unput routine
*
* Inputs:
* c - the character to push back onto the input stream
*
***********************************************************************
*/
void twmUnput (c)
int c;
{
if (overflowlen < sizeof overflowbuff) {
overflowbuff[overflowlen++] = (char) c;
} else {
twmrc_error_prefix ();
fprintf (stderr, "unable to unput character (%d)\n",
c);
}
}
/***********************************************************************
*
* Procedure:
* TwmOutput - redefinition of the lex output routine
*
* Inputs:
* c - the character to print
*
***********************************************************************
*/
void
TwmOutput(c)
{
putchar(c);
}
/**********************************************************************
*
* Parsing table and routines
*
***********************************************************************/
typedef struct _TwmKeyword {
char *name;
int value;
int subnum;
} TwmKeyword;
#define kw0_NoDefaults 1
#define kw0_AutoRelativeResize 2
#define kw0_ForceIcons 3
#define kw0_NoIconManagers 4
#define kw0_OpaqueMove 5
#define kw0_InterpolateMenuColors 6
#define kw0_NoVersion 7
#define kw0_SortIconManager 8
#define kw0_NoGrabServer 9
#define kw0_NoMenuShadows 10
#define kw0_NoRaiseOnMove 11
#define kw0_NoRaiseOnResize 12
#define kw0_NoRaiseOnDeiconify 13
#define kw0_DontMoveOff 14
#define kw0_NoBackingStore 15
#define kw0_NoSaveUnders 16
#define kw0_RestartPreviousState 17
#define kw0_ClientBorderWidth 18
#define kw0_NoTitleFocus 19
#define kw0_RandomPlacement 20
#define kw0_DecorateTransients 21
#define kw0_ShowIconManager 22
#define kw0_NoCaseSensitive 23
#define kw0_NoRaiseOnWarp 24
#define kw0_WarpUnmapped 25
#define kws_UsePPosition 1
#define kws_IconFont 2
#define kws_ResizeFont 3
#define kws_MenuFont 4
#define kws_TitleFont 5
#define kws_IconManagerFont 6
#define kws_UnknownIcon 7
#define kws_IconDirectory 8
#define kws_MaxWindowSize 9
#define kwn_ConstrainedMoveTime 1
#define kwn_MoveDelta 2
#define kwn_XorValue 3
#define kwn_FramePadding 4
#define kwn_TitlePadding 5
#define kwn_ButtonIndent 6
#define kwn_BorderWidth 7
#define kwn_IconBorderWidth 8
#define kwn_TitleButtonBorderWidth 9
#define kwcl_BorderColor 1
#define kwcl_IconManagerHighlight 2
#define kwcl_BorderTileForeground 3
#define kwcl_BorderTileBackground 4
#define kwcl_TitleForeground 5
#define kwcl_TitleBackground 6
#define kwcl_IconForeground 7
#define kwcl_IconBackground 8
#define kwcl_IconBorderColor 9
#define kwcl_IconManagerForeground 10
#define kwcl_IconManagerBackground 11
#define kwc_DefaultForeground 1
#define kwc_DefaultBackground 2
#define kwc_MenuForeground 3
#define kwc_MenuBackground 4
#define kwc_MenuTitleForeground 5
#define kwc_MenuTitleBackground 6
#define kwc_MenuShadowColor 7
/*
* The following is sorted alphabetically according to name (which must be
* in lowercase and only contain the letters a-z). It is fed to a binary
* search to parse keywords.
*/
static TwmKeyword keytable[] = {
{ "all", ALL, 0 },
{ "autoraise", AUTO_RAISE, 0 },
{ "autorelativeresize", KEYWORD, kw0_AutoRelativeResize },
{ "bordercolor", CLKEYWORD, kwcl_BorderColor },
{ "bordertilebackground", CLKEYWORD, kwcl_BorderTileBackground },
{ "bordertileforeground", CLKEYWORD, kwcl_BorderTileForeground },
{ "borderwidth", NKEYWORD, kwn_BorderWidth },
{ "button", BUTTON, 0 },
{ "buttonindent", NKEYWORD, kwn_ButtonIndent },
{ "c", CONTROL, 0 },
{ "center", JKEYWORD, J_CENTER },
{ "clientborderwidth", KEYWORD, kw0_ClientBorderWidth },
{ "color", COLOR, 0 },
{ "constrainedmovetime", NKEYWORD, kwn_ConstrainedMoveTime },
{ "control", CONTROL, 0 },
{ "cursors", CURSORS, 0 },
{ "decoratetransients", KEYWORD, kw0_DecorateTransients },
{ "defaultbackground", CKEYWORD, kwc_DefaultBackground },
{ "defaultforeground", CKEYWORD, kwc_DefaultForeground },
{ "defaultfunction", DEFAULT_FUNCTION, 0 },
{ "destroy", KILL, 0 },
{ "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 },
{ "dontmoveoff", KEYWORD, kw0_DontMoveOff },
{ "dontsqueezetitle", DONT_SQUEEZE_TITLE, 0 },
{ "east", DKEYWORD, D_EAST },
{ "f", FRAME, 0 },
{ "f.autoraise", FKEYWORD, F_AUTORAISE },
{ "f.backiconmgr", FKEYWORD, F_BACKICONMGR },
{ "f.beep", FKEYWORD, F_BEEP },
{ "f.bottomzoom", FKEYWORD, F_BOTTOMZOOM },
{ "f.circledown", FKEYWORD, F_CIRCLEDOWN },
{ "f.circleup", FKEYWORD, F_CIRCLEUP },
{ "f.colormap", FSKEYWORD, F_COLORMAP },
{ "f.cut", FSKEYWORD, F_CUT },
{ "f.cutfile", FKEYWORD, F_CUTFILE },
{ "f.deiconify", FKEYWORD, F_DEICONIFY },
{ "f.delete", FKEYWORD, F_DELETE },
{ "f.deltastop", FKEYWORD, F_DELTASTOP },
{ "f.destroy", FKEYWORD, F_DESTROY },
{ "f.downiconmgr", FKEYWORD, F_DOWNICONMGR },
{ "f.exec", FSKEYWORD, F_EXEC },
{ "f.file", FSKEYWORD, F_FILE },
{ "f.focus", FKEYWORD, F_FOCUS },
{ "f.forcemove", FKEYWORD, F_FORCEMOVE },
{ "f.forwiconmgr", FKEYWORD, F_FORWICONMGR },
{ "f.fullzoom", FKEYWORD, F_FULLZOOM },
{ "f.function", FSKEYWORD, F_FUNCTION },
{ "f.hbzoom", FKEYWORD, F_BOTTOMZOOM },
{ "f.hideiconmgr", FKEYWORD, F_HIDELIST },
{ "f.horizoom", FKEYWORD, F_HORIZOOM },
{ "f.htzoom", FKEYWORD, F_TOPZOOM },
{ "f.hzoom", FKEYWORD, F_HORIZOOM },
{ "f.iconify", FKEYWORD, F_ICONIFY },
{ "f.identify", FKEYWORD, F_IDENTIFY },
{ "f.lefticonmgr", FKEYWORD, F_LEFTICONMGR },
{ "f.leftzoom", FKEYWORD, F_LEFTZOOM },
{ "f.lower", FKEYWORD, F_LOWER },
{ "f.menu", FSKEYWORD, F_MENU },
{ "f.move", FKEYWORD, F_MOVE },
{ "f.nexticonmgr", FKEYWORD, F_NEXTICONMGR },
{ "f.nop", FKEYWORD, F_NOP },
{ "f.previconmgr", FKEYWORD, F_PREVICONMGR },
{ "f.quit", FKEYWORD, F_QUIT },
{ "f.raise", FKEYWORD, F_RAISE },
{ "f.raiselower", FKEYWORD, F_RAISELOWER },
{ "f.refresh", FKEYWORD, F_REFRESH },
{ "f.resize", FKEYWORD, F_RESIZE },
{ "f.restart", FKEYWORD, F_RESTART },
{ "f.righticonmgr", FKEYWORD, F_RIGHTICONMGR },
{ "f.rightzoom", FKEYWORD, F_RIGHTZOOM },
{ "f.saveyourself", FKEYWORD, F_SAVEYOURSELF },
{ "f.showiconmgr", FKEYWORD, F_SHOWLIST },
{ "f.sorticonmgr", FKEYWORD, F_SORTICONMGR },
{ "f.source", FSKEYWORD, F_BEEP }, /* XXX - don't work */
{ "f.title", FKEYWORD, F_TITLE },
{ "f.topzoom", FKEYWORD, F_TOPZOOM },
{ "f.twmrc", FKEYWORD, F_RESTART },
{ "f.unfocus", FKEYWORD, F_UNFOCUS },
{ "f.upiconmgr", FKEYWORD, F_UPICONMGR },
{ "f.version", FKEYWORD, F_VERSION },
{ "f.vlzoom", FKEYWORD, F_LEFTZOOM },
{ "f.vrzoom", FKEYWORD, F_RIGHTZOOM },
{ "f.warpring", FSKEYWORD, F_WARPRING },
{ "f.warpto", FSKEYWORD, F_WARPTO },
{ "f.warptoiconmgr", FSKEYWORD, F_WARPTOICONMGR },
{ "f.warptoscreen", FSKEYWORD, F_WARPTOSCREEN },
{ "f.winrefresh", FKEYWORD, F_WINREFRESH },
{ "f.zoom", FKEYWORD, F_ZOOM },
{ "forceicons", KEYWORD, kw0_ForceIcons },
{ "frame", FRAME, 0 },
{ "framepadding", NKEYWORD, kwn_FramePadding },
{ "function", FUNCTION, 0 },
{ "i", ICON, 0 },
{ "icon", ICON, 0 },
{ "iconbackground", CLKEYWORD, kwcl_IconBackground },
{ "iconbordercolor", CLKEYWORD, kwcl_IconBorderColor },
{ "iconborderwidth", NKEYWORD, kwn_IconBorderWidth },
{ "icondirectory", SKEYWORD, kws_IconDirectory },
{ "iconfont", SKEYWORD, kws_IconFont },
{ "iconforeground", CLKEYWORD, kwcl_IconForeground },
{ "iconifybyunmapping", ICONIFY_BY_UNMAPPING, 0 },
{ "iconmanagerbackground", CLKEYWORD, kwcl_IconManagerBackground },
{ "iconmanagerdontshow", ICONMGR_NOSHOW, 0 },
{ "iconmanagerfont", SKEYWORD, kws_IconManagerFont },
{ "iconmanagerforeground", CLKEYWORD, kwcl_IconManagerForeground },
{ "iconmanagergeometry", ICONMGR_GEOMETRY, 0 },
{ "iconmanagerhighlight", CLKEYWORD, kwcl_IconManagerHighlight },
{ "iconmanagers", ICONMGRS, 0 },
{ "iconmanagershow", ICONMGR_SHOW, 0 },
{ "iconmgr", ICONMGR, 0 },
{ "iconregion", ICON_REGION, 0 },
{ "icons", ICONS, 0 },
{ "interpolatemenucolors", KEYWORD, kw0_InterpolateMenuColors },
{ "l", LOCK, 0 },
{ "left", JKEYWORD, J_LEFT },
{ "lefttitlebutton", LEFT_TITLEBUTTON, 0 },
{ "lock", LOCK, 0 },
{ "m", META, 0 },
{ "maketitle", MAKE_TITLE, 0 },
{ "maxwindowsize", SKEYWORD, kws_MaxWindowSize },
{ "menu", MENU, 0 },
{ "menubackground", CKEYWORD, kwc_MenuBackground },
{ "menufont", SKEYWORD, kws_MenuFont },
{ "menuforeground", CKEYWORD, kwc_MenuForeground },
{ "menushadowcolor", CKEYWORD, kwc_MenuShadowColor },
{ "menutitlebackground", CKEYWORD, kwc_MenuTitleBackground },
{ "menutitleforeground", CKEYWORD, kwc_MenuTitleForeground },
{ "meta", META, 0 },
{ "mod", META, 0 }, /* fake it */
{ "monochrome", MONOCHROME, 0 },
{ "move", MOVE, 0 },
{ "movedelta", NKEYWORD, kwn_MoveDelta },
{ "nobackingstore", KEYWORD, kw0_NoBackingStore },
{ "nocasesensitive", KEYWORD, kw0_NoCaseSensitive },
{ "nodefaults", KEYWORD, kw0_NoDefaults },
{ "nograbserver", KEYWORD, kw0_NoGrabServer },
{ "nohighlight", NO_HILITE, 0 },
{ "noiconmanagers", KEYWORD, kw0_NoIconManagers },
{ "nomenushadows", KEYWORD, kw0_NoMenuShadows },
{ "noraiseondeiconify", KEYWORD, kw0_NoRaiseOnDeiconify },
{ "noraiseonmove", KEYWORD, kw0_NoRaiseOnMove },
{ "noraiseonresize", KEYWORD, kw0_NoRaiseOnResize },
{ "noraiseonwarp", KEYWORD, kw0_NoRaiseOnWarp },
{ "north", DKEYWORD, D_NORTH },
{ "nosaveunders", KEYWORD, kw0_NoSaveUnders },
{ "nostackmode", NO_STACKMODE, 0 },
{ "notitle", NO_TITLE, 0 },
{ "notitlefocus", KEYWORD, kw0_NoTitleFocus },
{ "notitlehighlight", NO_TITLE_HILITE, 0 },
{ "noversion", KEYWORD, kw0_NoVersion },
{ "opaquemove", KEYWORD, kw0_OpaqueMove },
{ "pixmaps", PIXMAPS, 0 },
{ "r", ROOT, 0 },
{ "randomplacement", KEYWORD, kw0_RandomPlacement },
{ "resize", RESIZE, 0 },
{ "resizefont", SKEYWORD, kws_ResizeFont },
{ "restartpreviousstate", KEYWORD, kw0_RestartPreviousState },
{ "right", JKEYWORD, J_RIGHT },
{ "righttitlebutton", RIGHT_TITLEBUTTON, 0 },
{ "root", ROOT, 0 },
{ "s", SHIFT, 0 },
{ "savecolor", SAVECOLOR, 0},
{ "select", SELECT, 0 },
{ "shift", SHIFT, 0 },
{ "showiconmanager", KEYWORD, kw0_ShowIconManager },
{ "sorticonmanager", KEYWORD, kw0_SortIconManager },
{ "south", DKEYWORD, D_SOUTH },
{ "squeezetitle", SQUEEZE_TITLE, 0 },
{ "starticonified", START_ICONIFIED, 0 },
{ "t", TITLE, 0 },
{ "title", TITLE, 0 },
{ "titlebackground", CLKEYWORD, kwcl_TitleBackground },
{ "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth },
{ "titlefont", SKEYWORD, kws_TitleFont },
{ "titleforeground", CLKEYWORD, kwcl_TitleForeground },
{ "titlehighlight", TITLE_HILITE, 0 },
{ "titlepadding", NKEYWORD, kwn_TitlePadding },
{ "unknownicon", SKEYWORD, kws_UnknownIcon },
{ "usepposition", SKEYWORD, kws_UsePPosition },
{ "w", WINDOW, 0 },
{ "wait", WAIT, 0 },
{ "warpcursor", WARP_CURSOR, 0 },
{ "warpunmapped", KEYWORD, kw0_WarpUnmapped },
{ "west", DKEYWORD, D_WEST },
{ "window", WINDOW, 0 },
{ "windowfunction", WINDOW_FUNCTION, 0 },
{ "windowring", WINDOW_RING, 0 },
{ "xorvalue", NKEYWORD, kwn_XorValue },
{ "zoom", ZOOM, 0 },
};
static int numkeywords = (sizeof(keytable)/sizeof(keytable[0]));
int parse_keyword (s, nump)
char *s;
int *nump;
{
register int lower = 0, upper = numkeywords - 1;
XmuCopyISOLatin1Lowered (s, s);
while (lower <= upper) {
int middle = (lower + upper) / 2;
TwmKeyword *p = &keytable[middle];
int res = strcmp (p->name, s);
if (res < 0) {
lower = middle + 1;
} else if (res == 0) {
*nump = p->subnum;
return p->value;
} else {
upper = middle - 1;
}
}
return ERRORTOKEN;
}
/*
* action routines called by grammar
*/
int do_single_keyword (keyword)
int keyword;
{
switch (keyword) {
case kw0_NoDefaults:
Scr->NoDefaults = TRUE;
return 1;
case kw0_AutoRelativeResize:
Scr->AutoRelativeResize = TRUE;
return 1;
case kw0_ForceIcons:
if (Scr->FirstTime) Scr->ForceIcon = TRUE;
return 1;
case kw0_NoIconManagers:
Scr->NoIconManagers = TRUE;
return 1;
case kw0_OpaqueMove:
Scr->OpaqueMove = TRUE;
return 1;
case kw0_InterpolateMenuColors:
if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE;
return 1;
case kw0_NoVersion:
/* obsolete */
return 1;
case kw0_SortIconManager:
if (Scr->FirstTime) Scr->SortIconMgr = TRUE;
return 1;
case kw0_NoGrabServer:
Scr->NoGrabServer = TRUE;
return 1;
case kw0_NoMenuShadows:
if (Scr->FirstTime) Scr->Shadow = FALSE;
return 1;
case kw0_NoRaiseOnMove:
if (Scr->FirstTime) Scr->NoRaiseMove = TRUE;
return 1;
case kw0_NoRaiseOnResize:
if (Scr->FirstTime) Scr->NoRaiseResize = TRUE;
return 1;
case kw0_NoRaiseOnDeiconify:
if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE;
return 1;
case kw0_DontMoveOff:
Scr->DontMoveOff = TRUE;
return 1;
case kw0_NoBackingStore:
Scr->BackingStore = FALSE;
return 1;
case kw0_NoSaveUnders:
Scr->SaveUnder = FALSE;
return 1;
case kw0_RestartPreviousState:
RestartPreviousState = True;
return 1;
case kw0_ClientBorderWidth:
if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE;
return 1;
case kw0_NoTitleFocus:
Scr->TitleFocus = FALSE;
return 1;
case kw0_RandomPlacement:
Scr->RandomPlacement = TRUE;
return 1;
case kw0_DecorateTransients:
Scr->DecorateTransients = TRUE;
return 1;
case kw0_ShowIconManager:
Scr->ShowIconManager = TRUE;
return 1;
case kw0_NoCaseSensitive:
Scr->CaseSensitive = FALSE;
return 1;
case kw0_NoRaiseOnWarp:
Scr->NoRaiseWarp = TRUE;
return 1;
case kw0_WarpUnmapped:
Scr->WarpUnmapped = TRUE;
return 1;
}
return 0;
}
int do_string_keyword (keyword, s)
int keyword;
char *s;
{
switch (keyword) {
case kws_UsePPosition:
{
int ppos = ParseUsePPosition (s);
if (ppos < 0) {
twmrc_error_prefix();
fprintf (stderr,
"ignoring invalid UsePPosition argument \"%s\"\n", s);
} else {
Scr->UsePPosition = ppos;
}
return 1;
}
case kws_IconFont:
if (!Scr->HaveFonts) Scr->IconFont.name = s;
return 1;
case kws_ResizeFont:
if (!Scr->HaveFonts) Scr->SizeFont.name = s;
return 1;
case kws_MenuFont:
if (!Scr->HaveFonts) Scr->MenuFont.name = s;
return 1;
case kws_TitleFont:
if (!Scr->HaveFonts) Scr->TitleBarFont.name = s;
return 1;
case kws_IconManagerFont:
if (!Scr->HaveFonts) Scr->IconManagerFont.name = s;
return 1;
case kws_UnknownIcon:
if (Scr->FirstTime) GetUnknownIcon (s);
return 1;
case kws_IconDirectory:
if (Scr->FirstTime) Scr->IconDirectory = ExpandFilename (s);
return 1;
case kws_MaxWindowSize:
JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
if ((JunkMask & (WidthValue | HeightValue)) !=
(WidthValue | HeightValue)) {
twmrc_error_prefix();
fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s);
return 0;
}
if (JunkWidth <= 0 || JunkHeight <= 0) {
twmrc_error_prefix();
fprintf (stderr, "MaxWindowSize \"%s\" must be positive\n", s);
return 0;
}
Scr->MaxWindowWidth = JunkWidth;
Scr->MaxWindowHeight = JunkHeight;
return 1;
}
return 0;
}
int do_number_keyword (keyword, num)
int keyword;
int num;
{
switch (keyword) {
case kwn_ConstrainedMoveTime:
ConstrainedMoveTime = num;
return 1;
case kwn_MoveDelta:
Scr->MoveDelta = num;
return 1;
case kwn_XorValue:
if (Scr->FirstTime) Scr->XORvalue = num;
return 1;
case kwn_FramePadding:
if (Scr->FirstTime) Scr->FramePadding = num;
return 1;
case kwn_TitlePadding:
if (Scr->FirstTime) Scr->TitlePadding = num;
return 1;
case kwn_ButtonIndent:
if (Scr->FirstTime) Scr->ButtonIndent = num;
return 1;
case kwn_BorderWidth:
if (Scr->FirstTime) Scr->BorderWidth = num;
return 1;
case kwn_IconBorderWidth:
if (Scr->FirstTime) Scr->IconBorderWidth = num;
return 1;
case kwn_TitleButtonBorderWidth:
if (Scr->FirstTime) Scr->TBInfo.border = num;
return 1;
}
return 0;
}
name_list **do_colorlist_keyword (keyword, colormode, s)
int keyword;
int colormode;
char *s;
{
switch (keyword) {
case kwcl_BorderColor:
GetColor (colormode, &Scr->BorderColor, s);
return &Scr->BorderColorL;
case kwcl_IconManagerHighlight:
GetColor (colormode, &Scr->IconManagerHighlight, s);
return &Scr->IconManagerHighlightL;
case kwcl_BorderTileForeground:
GetColor (colormode, &Scr->BorderTileC.fore, s);
return &Scr->BorderTileForegroundL;
case kwcl_BorderTileBackground:
GetColor (colormode, &Scr->BorderTileC.back, s);
return &Scr->BorderTileBackgroundL;
case kwcl_TitleForeground:
GetColor (colormode, &Scr->TitleC.fore, s);
return &Scr->TitleForegroundL;
case kwcl_TitleBackground:
GetColor (colormode, &Scr->TitleC.back, s);
return &Scr->TitleBackgroundL;
case kwcl_IconForeground:
GetColor (colormode, &Scr->IconC.fore, s);
return &Scr->IconForegroundL;
case kwcl_IconBackground:
GetColor (colormode, &Scr->IconC.back, s);
return &Scr->IconBackgroundL;
case kwcl_IconBorderColor:
GetColor (colormode, &Scr->IconBorderColor, s);
return &Scr->IconBorderColorL;
case kwcl_IconManagerForeground:
GetColor (colormode, &Scr->IconManagerC.fore, s);
return &Scr->IconManagerFL;
case kwcl_IconManagerBackground:
GetColor (colormode, &Scr->IconManagerC.back, s);
return &Scr->IconManagerBL;
}
return NULL;
}
int do_color_keyword (keyword, colormode, s)
int keyword;
int colormode;
char *s;
{
switch (keyword) {
case kwc_DefaultForeground:
GetColor (colormode, &Scr->DefaultC.fore, s);
return 1;
case kwc_DefaultBackground:
GetColor (colormode, &Scr->DefaultC.back, s);
return 1;
case kwc_MenuForeground:
GetColor (colormode, &Scr->MenuC.fore, s);
return 1;
case kwc_MenuBackground:
GetColor (colormode, &Scr->MenuC.back, s);
return 1;
case kwc_MenuTitleForeground:
GetColor (colormode, &Scr->MenuTitleC.fore, s);
return 1;
case kwc_MenuTitleBackground:
GetColor (colormode, &Scr->MenuTitleC.back, s);
return 1;
case kwc_MenuShadowColor:
GetColor (colormode, &Scr->MenuShadowColor, s);
return 1;
}
return 0;
}
/*
* put_pixel_on_root() Save a pixel value in twm root window color property.
*/
put_pixel_on_root(pixel)
Pixel pixel;
{
int i, addPixel = 1;
Atom pixelAtom, retAtom;
int retFormat;
unsigned long nPixels, retAfter;
Pixel *retProp;
pixelAtom = XInternAtom(dpy, "_MIT_PRIORITY_COLORS", True);
XGetWindowProperty(dpy, Scr->Root, pixelAtom, 0, 8192,
False, XA_CARDINAL, &retAtom,
&retFormat, &nPixels, &retAfter,
(unsigned char **)&retProp);
for (i=0; i< nPixels; i++)
if (pixel == retProp[i]) addPixel = 0;
if (addPixel)
XChangeProperty (dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS,
XA_CARDINAL, 32, PropModeAppend,
(unsigned char *)&pixel, 1);
}
/*
* do_string_savecolor() save a color from a string in the twmrc file.
*/
int do_string_savecolor(colormode, s)
int colormode;
char *s;
{
Pixel p;
GetColor(colormode, &p, s);
put_pixel_on_root(p);
}
/*
* do_var_savecolor() save a color from a var in the twmrc file.
*/
typedef struct _cnode {int i; struct _cnode *next;} Cnode, *Cptr;
Cptr chead = NULL;
int do_var_savecolor(key)
int key;
{
Cptr cptrav, cpnew;
if (!chead) {
chead = (Cptr)malloc(sizeof(Cnode));
chead->i = key; chead->next = NULL;
}
else {
cptrav = chead;
while (cptrav->next != NULL) { cptrav = cptrav->next; }
cpnew = (Cptr)malloc(sizeof(Cnode));
cpnew->i = key; cpnew->next = NULL; cptrav->next = cpnew;
}
}
/*
* assign_var_savecolor() traverse the var save color list placeing the pixels
* in the root window property.
*/
void assign_var_savecolor()
{
Cptr cp = chead;
while (cp != NULL) {
switch (cp->i) {
case kwcl_BorderColor:
put_pixel_on_root(Scr->BorderColor);
break;
case kwcl_IconManagerHighlight:
put_pixel_on_root(Scr->IconManagerHighlight);
break;
case kwcl_BorderTileForeground:
put_pixel_on_root(Scr->BorderTileC.fore);
break;
case kwcl_BorderTileBackground:
put_pixel_on_root(Scr->BorderTileC.back);
break;
case kwcl_TitleForeground:
put_pixel_on_root(Scr->TitleC.fore);
break;
case kwcl_TitleBackground:
put_pixel_on_root(Scr->TitleC.back);
break;
case kwcl_IconForeground:
put_pixel_on_root(Scr->IconC.fore);
break;
case kwcl_IconBackground:
put_pixel_on_root(Scr->IconC.back);
break;
case kwcl_IconBorderColor:
put_pixel_on_root(Scr->IconBorderColor);
break;
case kwcl_IconManagerForeground:
put_pixel_on_root(Scr->IconManagerC.fore);
break;
case kwcl_IconManagerBackground:
put_pixel_on_root(Scr->IconManagerC.back);
break;
}
cp = cp->next;
}
if (chead) {
free(chead);
chead = NULL;
}
}
static int ParseUsePPosition (s)
register char *s;
{
XmuCopyISOLatin1Lowered (s, s);
if (strcmp (s, "off") == 0) {
return PPOS_OFF;
} else if (strcmp (s, "on") == 0) {
return PPOS_ON;
} else if (strcmp (s, "non-zero") == 0 ||
strcmp (s, "nonzero") == 0) {
return PPOS_NON_ZERO;
}
return -1;
}
do_squeeze_entry (list, name, justify, num, denom)
name_list **list; /* squeeze or dont-squeeze list */
char *name; /* window name */
int justify; /* left, center, right */
int num; /* signed num */
int denom; /* 0 or indicates fraction denom */
{
int absnum = (num < 0 ? -num : num);
if (denom < 0) {
twmrc_error_prefix();
fprintf (stderr, "negative SqueezeTitle denominator %d\n", denom);
return;
}
if (absnum > denom && denom != 0) {
twmrc_error_prefix();
fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n",
num, denom);
return;
}
if (denom == 1) {
twmrc_error_prefix();
fprintf (stderr, "useless SqueezeTitle faction %d/%d, assuming 0/0\n",
num, denom);
num = 0;
denom = 0;
}
if (HasShape) {
SqueezeInfo *sinfo;
sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo));
if (!sinfo) {
twmrc_error_prefix();
fprintf (stderr, "unable to allocate %d bytes for squeeze info\n",
sizeof(SqueezeInfo));
return;
}
sinfo->justify = justify;
sinfo->num = num;
sinfo->denom = denom;
AddToList (list, name, (char *) sinfo);
}
}